<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>类</title>
</head>
<body>
<!--
es6中class类的全方面理解（一）
https://www.jianshu.com/p/86267fab4878

菜鸟教程 ：  4.3 ES6 Class 类
https://www.runoob.com/w3cnote/es6-class.html
-->
<script>

    /**
     * 传统的javascript中只有对象，没有类的概念。
     * 它是基于原型的面向对象语言。
     * 原型对象特点就是将自身的属性共享给新对象。
     * 如果要生成一个对象实例，需要先定义一个构造函数，然后通过new操作符来完成。
     */

    //函数名和实例化构造名相同且大写（非强制，但这么写有助于区分构造函数和普通函数）
    function Person(name, age) {
        this.name = name;
        this.age = age;
    }

    Person.prototype.say = function () {
        return "我的名字叫" + this.name + "今年" + this.age + "岁了";
    };

    //通过构造函数创建对象，必须使用new 运算符
    let obj = new Person("xqq", 18);
    console.log(obj.say());//我的名字叫xq今年18岁了
    console.log(typeof Person);//function
    console.log(Person === Person.prototype.constructor);//true

    console.log("========================================================")

    /**
     * ES6引入了Class（类）这个概念，通过class关键字可以定义类。
     * 该关键字的出现使得其在对象写法上更加清晰，更像是一种面向对象的语言。
     * 1.在类中声明方法的时候，千万不要给该方法加上function关键字
     * 2.方法之间不要用逗号分隔，否则会报错
     * 类实质上就是一个函数。
     * 类自身指向的就是构造函数。所以可以认为ES6中的类其实就是构造函数的另外一种写法！
     */

    class Person2 {//定义了一个名字为Person的类
        constructor(name, age) {//constructor是一个构造方法，用来接收参数
            this.name = name;//this代表的是实例对象
            this.age = age;
        }

        say2() {//这是一个类的方法，注意千万不要加上function
            return "my name is " + this.name + " my age is " + this.age;
        }
    }

    const obj2 = new Person2("xqq2", 16);
    console.log(obj2.say2());//我的名字叫xq今年18岁了
    console.log(typeof Person2);//function
    console.log(Person2 === Person2.prototype.constructor);//true


</script>
</body>







